package 力扣;

/**
 * 使用类来模拟链表
 */
class ListNode {
      int val;
      ListNode next;
      ListNode(int x) {
          val = x;
      }
 }

public class 两数相加2 {
    /**
     * 三位数的加法
     *
        * @param listNode1
    	* @param listNode2
        * @return 力扣.ListNode
        * @author Changan
        * @date 2020/9/21 21:12
    */
    ListNode add(ListNode listNode1 ,ListNode listNode2){
        ListNode listNode3 = new ListNode(0);
        listNode3.next=new ListNode(0);
        listNode3.next.next=new ListNode(0);
        listNode3.next.next.next=new ListNode(0);

        int tempval=0;
        int va11=listNode1.val+listNode2.val;
        int val2=listNode1.next.val+listNode2.next.val;
        int val3=listNode1.next.next.val+listNode2.next.next.val;
        if (va11<10){//第一位
            listNode3.val=va11;
        }else{
            listNode3.val=va11-10;
            listNode3.next.val+=1;
        }

        if (val2<10){//第二位
            if (val2+listNode3.next.val<10) {//第二位和原始第二位相加
                listNode3.next.val += val2;
            }else {
                listNode3.next.val=val2+listNode3.next.val-10;
                listNode3.next.next.val=1;//送到第三位
            }
        }else {
            tempval=listNode3.next.val+val2;
            if (tempval>=20){//大于二十
                listNode3.next.val=tempval-20;
                listNode3.next.next.val+=2;
            }
            if (tempval>=10){//大于十
                listNode3.next.val=tempval-10;
                listNode3.next.next.val+=1;
            }/*else{
                listNode3.next.val=val2-10;
                listNode3.next.next.val+=1;
            }*/
        }
        if (val3<10){
            tempval=listNode3.next.next.val+val3;
            if (tempval<10){
                listNode3.next.next.val=tempval;
            }else{
                listNode3.next.next.val=tempval-10;
                listNode3.next.next.next.val=1;//第四位
            }
        }else{
            tempval=listNode3.next.next.val+val3;
            if (tempval>=20){
                listNode3.next.next.val=tempval-20;
                listNode3.next.next.next.val=2;
            }else{
                listNode3.next.next.val=tempval-10;
                listNode3.next.next.next.val=1;
            }
        }
        return listNode3;

    }
    ListNode add2(ListNode listNode1 ,ListNode listNode2){
        ListNode listNode3 = new ListNode(0);

        listNode3.next.next=new ListNode(0);
       /* listNode3.next=new ListNode(0);
        listNode3.next.next=new ListNode(0);*/
        int tempval=0;
        int va11=listNode1.val+listNode2.val;

        if (va11<10){//第一位:个位
            listNode3.val=va11;
        }else{
            listNode3.val=va11-10;
//            listNode3.next=new ListNode(0);
            listNode3.next=new ListNode(0);
            listNode3.next.val+=1;//个位进一到十位（listnode3.next第一次出现）
        }
        if (listNode1.next!=null||listNode2.next!=null){//十位不为0
            int val2=0;
            if (listNode1.next==null){
                val2=0+listNode2.next.val;
            }
            else if (listNode2.next==null){
                val2=listNode1.next.val+0;
            }else {
                val2=listNode1.next.val+listNode2.next.val;
            }
            if (val2<10&&val2>0){//第二位
                if (listNode3.next!=null){
                    if (val2+listNode3.next.val<10) {//第二位和之前的第二位相加（也可能是没用十位）
                        listNode3.next.val += val2;
                    }
                    else {
                        listNode3.next.val=val2+listNode3.next.val-10;
                        listNode3.next.next.val=1;//送到第三位  listNode3的百位第一次创建
                    }
                }else{
                    listNode3.next=new ListNode(0);//listNode3的十位第一次创建
                    listNode3.next.val=val2;
                }

            }else {
                if (listNode3.next!=null){
                    tempval=listNode3.next.val+val2;
                    if (tempval>=20){//大于二十
                        listNode3.next.val=tempval-20;
                        listNode3.next.next.val+=2;//listNode3的百位第一次创建
                    }
                    if (tempval>=10){//大于十
                        listNode3.next.val=tempval-10;
                        listNode3.next.next=new ListNode(0);
                        listNode3.next.next.val+=1;
                    }/*else{
                listNode3.next.val=val2-10;
                listNode3.next.next.val+=1;
            }*/
                }

            }
        }
        if (listNode1.next!=null&&listNode2.next!=null){
            if (listNode1.next.next!=null||listNode1.next.next!=null){//百位的存在
                int val3=0;
                if (listNode1.next==null){
                    val3=0+listNode2.next.next.val;
                }
                else if (listNode2.next==null){
                    val3=listNode1.next.next.val+0;
                }else {
                    val3=listNode1.next.next.val+listNode2.next.next.val;
                }
                if (val3<10){
                    tempval=listNode3.next.next.val+val3;
                    if (tempval<10){
                        listNode3.next.next.val=tempval;
                    }else{
                        listNode3.next.next.val=tempval-10;
                        listNode3.next.next.next.val=1;//第四位
                    }
                }else{
                    tempval=listNode3.next.next.val+val3;
                    if (tempval>=20){
                        listNode3.next.next.val=tempval-20;
                        listNode3.next.next.next.val=2;
                    }else{
                        listNode3.next.next.val=tempval-10;
                        listNode3.next.next.next=new ListNode(0);
                        listNode3.next.next.next.val=1;
                    }
                }
            }
        }


        return listNode3;

    }
    //通过
    ListNode add3(ListNode l1,ListNode l2){
        ListNode l3 = new ListNode(0);
        ListNode l4 = l3;
        for (;l1!=null||l2!=null; ) {
            if (l3.next==null){
                l3.next=new ListNode(0);
            }
            l3=l3.next;
            int val=0;
            if (l1==null){
                val=l2.val+l3.val;
                l2=l2.next;
            }else if (l2==null){
                val=l1.val+l3.val;
                l1=l1.next;
            }else{
                val=l1.val+l2.val+l3.val;
                l1=l1.next;l2=l2.next;
            }
            if (val<10){
                l3.val=val;
                /*if (l1.next!=null||l2.next!=null)
                  l3.next=new ListNode(0);
                else
                  break;*/
            }else {
                l3.val=val-10;
                l3.next=new ListNode(1);
            }
         //   System.out.println(l3.val);
        }
       // System.out.println(l3.val+"???");
        return l4.next;
    }
    public static void main(String[] args) {
        /*ListNode listNode1 = new ListNode(9);
        listNode1.next=new ListNode(9);
        listNode1.next.next=new ListNode(9);
        ListNode listNode2 = new ListNode(9);
        listNode2.next=new ListNode(9);
        listNode2.next.next=new ListNode(9);
        ListNode listNode = new 两数相加().add(listNode1, listNode2);
        System.out.println(listNode.next.next.next.val+" "+listNode.next.next.val+" "+listNode.next.val+" "+listNode.val);*/
        ListNode listNode3 = new ListNode(1);
        listNode3.next=new ListNode(1);
        listNode3.next.next=new ListNode(1);
        ListNode listNode4 = new ListNode(0);
        listNode4.next=new ListNode(1);
        listNode4.next.next=new ListNode(1);
        ListNode listNode5 = new 两数相加2().add3(listNode3, listNode4);
      // System.out.println(listNode5.next.next.next.val+" "+listNode5.next.next.val+" "+listNode5.next.val+" "+listNode5.val);
     //  System.out.println(listNode5.next.next.val+" "+listNode5.next.val+" "+listNode5.val);
        //System.out.println(listNode5.val);
    }

}
